package controlador;

import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;

import modelo.CompraDAO;
import modelo.Datos;
import modelo.Ingrediente;
import modelo.IngredienteDAO;

import vista.DlgCompra;


public class ContCompra {
	private class Detalle {
		public Detalle(Ingrediente ing, double cant) {
			ingrediente = ing;
			cantidad = cant;
		}
		
		Ingrediente ingrediente;
		double cantidad;
	}
	
	private DlgCompra dlg = null;
	private ArrayList<Detalle> lista = new ArrayList<Detalle>();
	private AbstractTableModel tmodelo = null;
	private JFrame frm;
	
	public ContCompra() {
	}
	
	public void mostrar(JFrame frame) {
		dlg = new DlgCompra(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.getTblCompra().setSelectionMode(0);
		dlg.getTblCompra().setAutoscrolls(true);
		
		frm = frame;
		
		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 2;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Ingrediente";
				case 1: return "Cantidad";
				
				}
				
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.size();
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista.get(row); 
				switch (col) {
				case 0: return obj.ingrediente.getNombre();
				case 1: return obj.cantidad;
				}
				return null;
			}

			@Override
			public void setValueAt(Object value, int row, int col) {
				Detalle obj = lista.get(row);

				try {
					double n = Double.parseDouble(value.toString());
					if (n > 0) {
						
						obj.cantidad = n;
						fireTableRowsUpdated(row, row);
					} else
						dlg.mostrarMensaje("Se requiere un número superior a 0.");
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor inválido.");
				}
			}
			
			@Override
			public boolean isCellEditable(int row, int col) {
				return col == 1;
			}
		};
		
		dlg.getTblCompra().setModel(tmodelo);
		
		dlg.getBtAnadir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ContSelecIngre contsing = new ContSelecIngre();
				Ingrediente ing = contsing.mostrar(frm);
				if (ing != null) {
					
					lista.add(new Detalle(ing, 1));
					int i = tmodelo.getRowCount();
					tmodelo.fireTableRowsInserted(i - 1, i - 1);
				}
				
			}
		});
		
		dlg.getBtQuitar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int i = dlg.getTblCompra().getSelectedRow();
				if (i >= 0) {
					lista.remove(i);
					tmodelo.fireTableRowsDeleted(i, i);
				}
			}
		});
		
		dlg.getBtAceptar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				CompraDAO codao = Datos.getInstancia().getCompras();
				IngredienteDAO indao=Datos.getInstancia().getIngredientes();
				Ingrediente ing;
				
				
				for (Detalle det : lista) {
					ing=det.ingrediente;
					codao.anadir(ing, det.cantidad);
					ing.setCantidad(ing.getCantidad()+det.cantidad);
					indao.actualizar(ing);
					
				}
				if(dlg.getTblCompra().getRowCount()!=0)
				{
					dlg.mostrarMensaje("Compra Efectuada");
					dlg.dispose();
				}
				else
					dlg.mostrarMensaje("Debe Agregar un Ingrediente");
					
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				dlg.dispose();
			}
		});
		
		dlg.setModalityType(ModalityType.APPLICATION_MODAL);
		dlg.setVisible(true);
	}
	
	
}
